package com.example.yx.demo14;

//模拟继承FastClass

import org.springframework.cglib.core.Signature;

public class ProxyFastClass {

    static Signature s0 = new Signature("saveSuper","()V");
    static Signature s1 = new Signature("saveSuper","(I)V");
    static Signature s2 = new Signature("saveSuper","(J)V");
    //获取代理方法的编号,这些方法是未经改写的，这个编号假设自定义的
    /*
    Proxy
        saveSuper()            0
        saveSuper(int i)       1
        saveSuper(long i)      2
        hashcode()
        .....
     */
    //根据Signature（签名信息）来获取编号，signature 包括方法名、参数和返回值
    /*在创建MethodProxy对象时，提供的；
    save0Proxy = MethodProxy.create(Target.class,Proxy.class,"()V","save","saveSuper");
    "()V","save"就被用于组装signature
     */
    public  int getIndex(Signature signature){
        if (s0.equals(signature)) {
            return 0;
        } else if (s1.equals(signature)) {
            return 1;
        } else if (s2.equals(signature)) {
            return 2;
        }
        return -1;//没找到
    }

    /*根据返回的方法编号去正常调用目标对象的方法，
        index：编号,由签名获取
        target：目标对象，由MethodProxy的invoke方法的参数（target，args）传入
        args：参数列表，由MethodProxy的invoke方法的参数（target，args）传入

     */
    public Object invoke(int index, Object proxy, Object[] args){
        if (index == 0) {
            ((Proxy) proxy).saveSuper();
            return null;
        } else if (index == 1) {
            ((Proxy) proxy).saveSuper((Integer) args[0]);
            return null;
        } else if (index == 2) {
            ((Proxy) proxy).saveSuper((Long) args[0]);
            return null;
        } else {
            throw new RuntimeException("无此方法");
        }
    }

}
